
/**
 * 
 * 
 * 跳房子
 * 
 * 题目描述

跳房子，也叫跳飞机，是一种世界性的儿童游戏。

游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格。

跳房子的过程中，可以向前跳，也可以向后跳。

假设房子的总格数是count，小红每回合可能连续跳的步教都放在数组steps中，请问数组中是否有一种步数的组合，可以让小红两个回合跳到量后一格?

如果有，请输出索引和最小的步数组合。

注意：

数组中的步数可以重复，但数组中的元素不能重复使用。
提供的数据保证存在满足题目要求的组合，且索引和最小的步数组合是唯一的。

输入描述
第一行输入为房子总格数count，它是int整数类型。
第二行输入为每回合可能连续跳的步数，它是int整数数组类型。

输出描述
返回索引和最小的满足要求的步数组合（顺序保持steps中原有顺序）

备注
count ≤ 1000
0 ≤ steps.length ≤ 5000
-100000000 ≤ steps[i] ≤ 100000000
用例
输入	[1,4,5,2,2]
7
输出	[5, 2]
说明	无
输入	[-1,2,4,9,6]
8
输出	[-1, 9]

[1,2,9,9,9,1,9,9,3,2]
4

说明	此样例有多种组合满足两回合跳到最后，譬如：[-1,9]，[2,6]，其中[-1,9]的索引和为0+3=3，[2,6]的索和为1+4=5，所以索引和最小的步数组合[-1,9]


 * 
 */

import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

/**
  *
  即有一个数组steps，要在其中找到一个二元组，让其和等于count。

和leetcode两数之和的区别在于，本题最终解二元组可能有多个解，我们需要在这多个解中找到索引和最小的作为最终解，
即我们不仅要求二元组元素之和，还要求二元组索引之和。 



  */
public class 跳房子 {

    public static void main(String[] args) {
        
        try{

            Scanner scanner = new Scanner(System.in);

            //解析数字数组
            String intStrArr = scanner.nextLine();
            int[] intArr = Arrays.stream(intStrArr.substring(1, intStrArr.length()-1).split(","))
            .mapToInt(Integer::parseInt).toArray();

            int target = Integer.parseInt(scanner.nextLine());

            //从数组中找出 2 个数字和 == target

            //采用map 做缓存，target - num 的 差值如果在 map中存在num1 则表示 num 和 num1 之和 == target
            //并取出 num1 对应的下标

            HashMap<Integer, Integer> cacheMap = new HashMap<>();

            int minPosition = Integer.MAX_VALUE;

            String result = "";
            
            for(int i =0; i<intArr.length; i++){

                int num = intArr[i];
                int diffValue = target - num;

                if(cacheMap.containsKey(diffValue)){

                    //map 中存在 diffValue  则表示 diffValue + num = target
                    //2 个数的下标之和

                    int positionSum = i + cacheMap.get(diffValue);
                    //System.out.println("命中，下标之和--"+positionSum);
                    if((i + cacheMap.get(diffValue)) < minPosition){

                        minPosition = positionSum;
                        result = "["+diffValue+","+num+"]";

                    }

                } else {

                    //System.out.println("未命中，添加在map--"+diffValue);

                    cacheMap.putIfAbsent(num, i);

                }


            }


            System.out.println(result);



        }catch(Exception e){

            e.printStackTrace();
            System.out.println("程序异常"+(e == null ?"":e.getMessage()));
        }
    }
}